package pers.kw.sdk.too.word2pdf;


import fr.opensagres.xdocreport.converter.ConverterTypeTo;
import fr.opensagres.xdocreport.converter.Options;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 该工具类用于把word生成pdf文件
 */
@Slf4j
@Component
public class Word2PdfAsposeUtil {

    @Resource
    private Word2PdfConfig word2PdfConfig;

    /**
     * XDocReport word转pdf
     */
    public byte[] word2pdfByXDocReport(@NonNull String fileName, Object data) {
        try {
            log.info("XDocReport word转pdf，协议文件【{}】", fileName);
            String filePath = word2PdfConfig.getTemplatesDir() + fileName;
            log.info("word协议文件路径【{}】", filePath);
            FileInputStream input = new FileInputStream(filePath);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            //加载word模板，并指定使用FreeMarker引擎
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(input, TemplateEngineKind.Freemarker);

            //创建上下文并填充动态参数
            IContext context = report.createContext();
            Map<String, Object> dataParams = new HashMap<>();
            dataParams.put("data", data);
            context.putMap(dataParams);

            //将填充动态参数后的word文档转为pdf
            Options options = Options.getTo(ConverterTypeTo.PDF);
            report.convert(context, options, output);

            //获取生成的pdf文件的字节数组
            return output.toByteArray();
        } catch (Exception e) {
            log.error("XDocReport word转pdf 失败...", e);
            return null;
        }
    }

    /**
     * XDocReport word转pdf
     */
    public byte[] word2pdfByXDocReport(@NonNull InputStream templateInputStream, Object data) {
        try {
            log.info("XDocReport word转pdf...");
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            //加载word模板，并指定使用FreeMarker引擎
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(templateInputStream, TemplateEngineKind.Freemarker);

            //创建上下文并填充动态参数
            IContext context = report.createContext();
            Map<String, Object> dataParams = new HashMap<>();
            dataParams.put("data", data);
            context.putMap(dataParams);

            //将填充动态参数后的word文档转为pdf
            Options options = Options.getTo(ConverterTypeTo.PDF);
            report.convert(context, options, output);

            //获取生成的pdf文件的字节数组
            return output.toByteArray();
        } catch (Exception e) {
            log.error("XDocReport word转pdf 失败...", e);
            return null;
        }
    }
}

